【问题标题】:JPA mapping for one to many with inheritance mapping具有继承映射的一对多的 JPA 映射
【发布时间】:2012-12-08 00:00:36
【问题描述】:

我有一个场景。

@Entity
@Table(name = "someTable")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Access(AccessType.FIELD)
@DiscriminatorColumn(name = "someDisc")
public abstract class AbstractClass{}

@Entity
@Access(AccessType.FIELD)
@DiscriminatorValue("1")
public class Child1 extends AbstractClass{
}

@Entity
@Access(AccessType.FIELD)
@DiscriminatorValue("2")
public class Child2 extends AbstractClass{
}

现在在第三张桌子我想要这样的东西

@Entity
@Table
public class ThridTable{

    @OneToMany(cascade = CascadeType.ALL, fetch = EAGER, orphanRemoval = true)
    @JoinColumn(name = "foreinKeyCol", nullable = false)
    @OrderColumn(name = "orderCol")
    private List<Child2> child2 = new ArrayList<>();


    @OneToMany(cascade = CascadeType.ALL, fetch = EAGER, orphanRemoval = true)
    @JoinColumn(name = "foreinKeyCol", nullable = false)
    @OrderColumn(name = "orderCol")
    private List<Child1> child1 = new ArrayList<>();

//more setters/getters
}

现在虽然它可以很好地保存并且值可以正确保存在表中。使用 ThridTable 对象获取对象时遇到的问题。生成的查询不会区分两个实例,即同一表中的 child1 和 child2,并尝试更新 child 1 中 child2 的对象。

【问题讨论】:

  • 您不能使用同一列来映射两个不同的关联。为每个关联使用不同的列。
  • @JBNizet:我们能否通过指定描述符列值来指定强制休眠查询的任何方式或任何类型的映射?目前只指定了 JoinColumn 值。
  • @JBNizet 你不认为这是一个 JPA 错误吗?
  • @JBNizet 还有一件事。提供两个不同的列将无济于事。所以有两个不同的列将无济于事。

标签: java hibernate jakarta-ee jpa annotations


【解决方案1】:

如果您使用的是休眠,您可以将@Where 条件添加到@OneToMany 映射。

例如:

@OneToMany(cascade = CascadeType.ALL, fetch = EAGER, orphanRemoval = true)
@JoinColumn(name = "foreinKeyCol", nullable = false)
@OrderColumn(name = "orderCol")
@Where(clause="someDisc=1")
private List<Child1> child1 = new ArrayList<>();

看看 api: http://docs.jboss.org/hibernate/core/4.1/javadocs/org/hibernate/annotations/Where.html

和: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-collection

【讨论】:

  • 有没有什么方法或技术可以用纯 JPA 做到这一点?
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多