Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在2个表中拆分Hibernate实体_Java_Hibernate_Jpa_Jakarta Ee_Orm - Fatal编程技术网

Java 在2个表中拆分Hibernate实体

Java 在2个表中拆分Hibernate实体,java,hibernate,jpa,jakarta-ee,orm,Java,Hibernate,Jpa,Jakarta Ee,Orm,我有一个简单的类层次结构,我正在尝试使用Hibernate/JPA 基本上,我希望MovementData位于它自己的表中,其中FK是数据库中主Vehicle表的整数id 我做错什么了吗?我怎样才能完成类似的事情? 我很确定我遵循了JPA规范(EJB3在实际操作中说这应该是可行的: 以下是我得到的例外情况的一部分: SEVERE: an assertion failure occured (this may indicate a bug in Hibernate, but is more lik

我有一个简单的类层次结构,我正在尝试使用Hibernate/JPA

基本上,我希望MovementData位于它自己的表中,其中FK是数据库中主Vehicle表的整数id

我做错什么了吗?我怎样才能完成类似的事情? 我很确定我遵循了JPA规范(EJB3在实际操作中说这应该是可行的:

以下是我得到的例外情况的一部分:

SEVERE: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: Table MOVEMENT_DATA not found
    at org.hibernate.persister.entity.JoinedSubclassEntityPersister.getTableId(JoinedSubclassEntityPersister.java:480)
    at org.hibernate.persister.entity.JoinedSubclassEntityPersister.<init>(JoinedSubclassEntityPersister.java:259)
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:87)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:261)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327)
车辆是父类

/**
 * Entity implementation class for Entity: Vehicle
 *
 */
@Entity
@Table(name="VEHICLE")
@Inheritance(strategy=InheritanceType.JOINED)
@SecondaryTable(name="MOVEMENT_DATA",
            pkJoinColumns = {
                @PrimaryKeyJoinColumn(name = "ID") 
            } 
)
public class Vehicle implements Serializable {


    private int numWheels;
    private String color;
    private int id;
    private MovementData movementData;
    private static final long serialVersionUID = 1L;


    public Vehicle() {
        super();
    }   

    @Embedded
    @AttributeOverrides( {
    @AttributeOverride(
        name = "speed",
        column = @Column(name = "SPEED",
                         table = "MOVEMENT_DATA")
    ),
    @AttributeOverride(
        name = "timeOfPosition",
        column = @Column(name = "TIME_OF_POSITION",
                         table = "MOVEMENT_DATA")
    ),
    @AttributeOverride(
            name = "longitude",
            column = @Column(name = "LONGITUDE",
                             table = "MOVEMENT_DATA")
        ),
   @AttributeOverride(
            name = "latitude",
            column = @Column(name = "LATITUDE",
                             table = "MOVEMENT_DATA")
        )
})
    public MovementData getMovementData() {
        return movementData;
    }
    public void setMovementData(MovementData movementData) {
        this.movementData = movementData;
    }

    @Column(name="NUM_WHEELS")
    public int getNumWheels() {
        return this.numWheels;
    }

    public void setNumWheels(int numWheels) {
        this.numWheels = numWheels;
    }   
    @Column(name="COLOR")
    public String getColor() {
        return this.color;
    }

    public void setColor(String color) {
        this.color = color;
    }   
    @Id    
    public int getId() {
        return this.id;
    }

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

}
汽车延伸车辆

/**
 * Entity implementation class for Entity: Car
 */
@Entity
@Table(name="CAR")
public class Car extends Vehicle implements Serializable {


    private String make;
    private static final long serialVersionUID = 1L;

    public Car() {
        super();
    }   
    /**
     * @return
     */
    @Column(name="MAKE")
    public String getMake() {
        return this.make;
    }

    /**
     * @param make
     */
    public void setMake(String make) {
        this.make = make;
    }

}
@Embeddable
public class MovementData implements Serializable {


    private double speed;
    private Date timeOfPosition;
    private double latitude;
    private double longitude;
    private static final long serialVersionUID = 1L;

    public MovementData() {
        super();
    }   



    /**
     * @return
     */
    @Column(name="SPEED")
    public double getSpeed() {
        return this.speed;
    }

    /**
     * @param speed
     */
    public void setSpeed(double speed) {
        this.speed = speed;
    }   
    /**
     * @return
     */
    @Column(name="TIME_OF_POSITION")
    public Date getTimeOfPosition() {
        return this.timeOfPosition;
    }

    /**
     * @param timeOfPosition
     */
    public void setTimeOfPosition(Date timeOfPosition) {
        this.timeOfPosition = timeOfPosition;
    }   

    /**
     * @return
     */
    @Column(name="LONGITUDE")
    public double getLongitude() {
        return this.longitude;
    }

    /**
     * @param longitude
     */
    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
    /**
     * @return
     */
    @Column(name="LATITUDE")
    public double getLatitude() {
        return this.latitude;
    }

    /**
     * @param latitude
     */
    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }   

}
移动数据嵌入到车辆中

/**
 * Entity implementation class for Entity: Car
 */
@Entity
@Table(name="CAR")
public class Car extends Vehicle implements Serializable {


    private String make;
    private static final long serialVersionUID = 1L;

    public Car() {
        super();
    }   
    /**
     * @return
     */
    @Column(name="MAKE")
    public String getMake() {
        return this.make;
    }

    /**
     * @param make
     */
    public void setMake(String make) {
        this.make = make;
    }

}
@Embeddable
public class MovementData implements Serializable {


    private double speed;
    private Date timeOfPosition;
    private double latitude;
    private double longitude;
    private static final long serialVersionUID = 1L;

    public MovementData() {
        super();
    }   



    /**
     * @return
     */
    @Column(name="SPEED")
    public double getSpeed() {
        return this.speed;
    }

    /**
     * @param speed
     */
    public void setSpeed(double speed) {
        this.speed = speed;
    }   
    /**
     * @return
     */
    @Column(name="TIME_OF_POSITION")
    public Date getTimeOfPosition() {
        return this.timeOfPosition;
    }

    /**
     * @param timeOfPosition
     */
    public void setTimeOfPosition(Date timeOfPosition) {
        this.timeOfPosition = timeOfPosition;
    }   

    /**
     * @return
     */
    @Column(name="LONGITUDE")
    public double getLongitude() {
        return this.longitude;
    }

    /**
     * @param longitude
     */
    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
    /**
     * @return
     */
    @Column(name="LATITUDE")
    public double getLatitude() {
        return this.latitude;
    }

    /**
     * @param latitude
     */
    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }   

}
持久性单位:

    <properties>
        <!-- The database dialect to use -->
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
        <!-- drop and create tables at deployment -->
        <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        <!-- Hibernate Query Language (HQL) parser. -->
        <!-- property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /-->
        <!-- property name="hibernate.cache.provider_class" value="org.hibernate.cache.JbossCacheProvider" /-->
        <property name ="hibernate.show_sql" value="false" />
        <property name ="hibernate.format_sql" value="false" />
        <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider" />
    </properties>


从您发布的异常情况来看,似乎尚未在数据库中创建表(“未找到表移动数据”)。如果您未指示Hibernate/JPA更改模式,则必须在运行代码之前手动添加表(我相信是CREATE-UPDATE指示Hibernate执行更改).

在开发过程中,启用此属性通常很方便:

cfg.setProperty(Environment.HBM2DDL_AUTO, "update");
其中cfg是我的注释配置


启用此属性很可能会解决您的问题。

可嵌入类的定义不应引用数据库表:

@Embeddable
public class MovementData implements Serializable {


    private double speed;
    private Date timeOfPosition;
    private double latitude;
    private double longitude;
    private static final long serialVersionUID = 1L;

    public MovementData() {
        super();
    }   

    @Column(name="SPEED")
    public double getSpeed() {
        return this.speed;
    }

    ...

    @Column(name="TIME_OF_POSITION")
    public Date getTimeOfPosition() {
        return this.timeOfPosition;
    }

    ...

    @Column(name="LONGITUDE")
    public double getLongitude() {
        return this.longitude;
    }

    ...

    @Column(name="LATITUDE")
    public double getLatitude() {
        return this.latitude;
    }

    ...
}
然后,车辆实体应为嵌入式结构定义二级表,包括连接列:


我希望这对您有用。

我会尝试将其分解以找出问题所在。尝试将移动数据制作成实体而不是可嵌入类。确保它可以独立存在,然后将其更改回可嵌入

虽然这不是您真正想要的关系,但您可以尝试将MovementData设置为根父级,并让Vehicle继承MovementData。这样,您只能使用

@Inheritance(strategy=InheritanceType.JOINED)

而不是继承加上第二个表。它将简化关系,但仍包括所有表。

使用适当的数据库客户端(查询浏览器、MS SQL Management Studio等)连接到数据库,以验证表是否确实存在

您可能还希望在代码中插入一个断点,以便在数据库抛出此错误之前准确地看到它的外观

尝试将hibernate.hbm2ddl.auto值设置为“create”,如下所示,并更改设置,使其打印出SQL,以便您可以看到它正在尝试什么:

<props>
  <!-- some possible values: create, create-drop, update -->
  <prop key="hibernate.hbm2ddl.auto">update</prop>
  <prop key="hibernate.show_sql">true</prop>
  ....
<props>

更新
真的
....

让我知道您在数据库中看到了什么。

我想这已经太晚了,但我在寻找其他内容时偶然发现了这个问题

问题是可嵌入类没有映射到表-可嵌入对象在数据库中没有标识

这就是为什么没有生成MovementData表的原因


我认为您混淆了嵌入的含义。正如前面的评论员所提到的,车辆和移动数据应该是一对一的关系,并且嵌入的注释应该被删除。您可能需要一个级联删除规则来确保如果车辆被删除,移动数据也会被删除。

我已经创建了删除集(请参见上面的my persistence.xml)。我只是用update尝试了一下,但仍然出现了相同的错误。请注意,有此问题的其他人:答案是自动选择的…这不起作用。感谢帮助…仍然会出现相同的错误。我束手无策!当我遇到这样的问题时,我会尝试简化游戏环境,使其尽可能透明在本例中,我将从车辆实体中取出继承设置-这样您就可以同时处理一个问题(希望如此)。解决了二级表中可嵌入对象的问题后,再回滚继承,看看它们是如何协同工作的。啊..我认为你是对的..将@SecondaryTable与联接继承策略混合可能会有问题,因为从DB的角度看,它们看起来是一样的。这不是一个真正理想的解决方案,因为我想要我的Java Ent因此,您也可以使它不是一个辅助表,而只是车辆和移动数据之间的一对一关系。使用正确的级联,它的行为将相同。当我将其设置为创建时,它最终不会在实际数据库中创建任何内容。它会在该点之前抛出该异常。我添加了更多的日志信息为什么不尝试将Id的列名添加到Vehicle的Id字段中,比如:@Id@column(name=“Id”)public int getId(){return this.Id;}