Java Hibernate Hierachy子类中不同的JoinColumn Column 'C01'指定了两次

标签 java mysql hibernate

我的模型中有多个实体,但其中一些实体共享相同的属性,即 Student。我创建了一个像这样的抽象类。

@javax.persistence.MappedSuperclass
public abstract class StudentImpl 
{
   private Student student;
   @ManyToOne(fetch=FetchType.LAZY)@JoinColumn(name="c01")    
   public Student getStudent(){return student;}
   @Override
   public void setStudent(final Student student){this.student=student;return;}
}

这就像一个魅力。看到其中 95% 已映射到我的 MySQL 表中的 C01 列。

我使用这个抽象类来扩展我的每个模型并共享相同的属性。

public class Teammate extends StudentImpl

在某些类中出现问题,Student 属性映射到表中的不同列名

示例

create table myTable 
(
   c02 int(11) NOT NULL, //student entity is mapped to c02 column instead of c01
)

正如您所看到的,它们的 c01 和 c02 不匹配,并且它们的列 c01 列映射到一个简单的 String 而不是 Student。

我已经尝试过

@javax.persistence.AttributeOverride(name="student",column=@Column(name="c02"))

希望 Hibernate 能够理解学生属性映射到该实体中的 c02 列。

@javax.persistence.AttributeOverride(name="student",column=@Column(name="c02"))
public class AnotherClass extends StudentImpl
{
    private String c01;
    private String getC01(){return this.c01;} //Column c01 is mapped to a String 
}

但似乎不起作用,因为它抛出

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Column 'C01' specified twice.

当我尝试插入新的 AnotherClass 注册表时,会出现此问题。

我做错了什么?难道就不能实现了吗?

已解决

感谢@ddalton,我找到了解决方案。我用过这个,效果很好:

@javax.persistence.AssociationOverride(name="student",joinColumns=@JoinColumn(name="c02"))

最佳答案

您可以使用 AssociationOverride 注释来完成此操作:

http://www.objectdb.com/api/java/jpa/AssociationOverrides

关于Java Hibernate Hierachy子类中不同的JoinColumn Column 'C01'指定了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30770140/

相关文章:

MySQL 表 - 计算过去 12 个月的分数

java - 连接由控制字段确定的不同表

java - Hibernate 多对多连接表不为继承的实体保留

java - Java中2D游戏的路径查找

java - Iterable<Key> 作为返回类型,这是什么意思?

java - Tomcat、Hibernate 和 java.io.EOFException

java - hibernate 恩弗斯 : Better way to add multiple Projections

java - 如何使用 JNA 运行 chrome?

java - : "Python For Else Loop" in Java 的高效实现

python - 将 mySQL 查询更改为 Django