【问题标题】:Hibernate/JPA Mapping to a Base ClassHibernate/JPA 映射到基类
【发布时间】:2012-07-15 04:52:13
【问题描述】:

考虑以下实体。我打算让 Child 类引用两个派生食品类( Local Food 或 Foreign )中的任何一个。这是一个人为的例子,我的真实域对象非常复杂,因此组合和使用例如 FoodType 列不是一个选项,因为两个 Food 子类仅在少数特征上相似。

@MappedSuperclass
public abstract class Food {

}



@Entity
public class LocalFood extends Food {

private long id;
private String name;
}


@Entity
public class ForeignFood extends Food {

    private long id;
    private String name;
}



@Entity
public class Child {    
private Food food; //Base Class needed here 
@ManyToOne()
public Food getFood() {
    return food;
}
}

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on                     com.sample.Child.food references an unknown entity: com.sample.Food

也不使用继承和鉴别器。

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Food {

private long id; // set , get (Auto gen) 
}

是否有可能使这种映射工作?

【问题讨论】:

  • 您必须将 Food 类映射为具有继承策略的实体,才能实现这一点。这样做时遇到什么异常?
  • 我收到Caused by: java.lang.ClassCastException: org.hibernate.mapping.SingleTableSubclass Caused by: java.lang.ClassCastException: org.hibernate.mapping.JoinedSubclass。对于每个 InheritanceType。
  • 这是由映射问题引起的。例如,请参阅forum.hibernate.org/viewtopic.php?f=1&t=1005287。此 ID 应在根类 (Food) 中声明。不是在每个子类中。
  • 没错,子类不应该有 ID。现在可以了。谢谢

标签: java hibernate jpa orm mapping


【解决方案1】:

JB Nizet 是对的。现在食物课是这样的。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Food {

 private long id;

 public void setId(long id) {
    this.id = id;
 }

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 public long getId() {
    return id;
 }

}

并且从子类中删除了 id。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2013-12-15
    • 2019-02-24
    • 1970-01-01
    • 2014-05-05
    • 2014-09-18
    相关资源
    最近更新 更多