当我只想要一个时,Hibernate会创建两个主键

时间:2010-01-08 15:12:12

标签: hibernate annotations primary-key object-persistence

我有一个名为Expression的Hibernate类(这里简化为了您的观看乐趣):

@Entity
public class Expression {
    @Id
    @GeneratedValue
    private long id;

    private String data;

    @OneToMany(fetch=FetchType.EAGER)
    @Cascade({CascadeType.MERGE, CascadeType.PERSIST})
    private Set<Expression> dependencies;
}

这会创建两个表Expression(id, data)Expression_Expression(expression_id, dependencies_id)。但是,Hibernate将expression_id和dependencies_id列都设置为主键,因此我不能拥有重复的dependencies_id,这就是我想要的。

例如,如果我有三个表达式:

Expression x = new Expression("0");
Expression y = new Expression("1");
Expression z = new Expression("x + y");
Set<Expression> tmp = new HashSet<Expression>();
tmp.add(x);
tmp.add(y);
z.setDependencies(tmp);
// Persist x, y, and z.

然后Hibernate将执行以下操作:

x插入Expression表,其中id = 1且data =“0”
y插入Expression表,其中id = 2且data =“1” 将z插入Expression表,其中id = 3,data =“a + b”
使用expression_id = 3和dependencies_id = 1在“Expression_Expression”表中插入一行。(使z成为x的依赖项。)

但是当它尝试在Expression_Expression表中插入一行,其中expression_id = 3且dependencydencies_id = 2(使z成为y的依赖项)我得到重复的输入错误。

我希望能够在Expression_Expression表格中拥有多个具有相同expression_id值的行。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

你应该在这里使用@ManyToMany关系