我正在尝试在两个实体之间应用一对一的关系 第一实体: 视频和 OrganizationsVideo 每个 OrganizationVideo 都有一个视频实体
所以我做了以下
首先 organization_video 表
CREATE TABLE `organization_video` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
视频表
CREATE TABLE `video` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
// rest of table contents
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后我在 organization_video 表
中添加了约束CONSTRAINT `FK_organization_video` FOREIGN KEY (`id`) REFERENCES `video` (`id`)
然后生成实体
Video.java
@Entity
@Table(name = "video")
public class Video extends Persistable<Long> {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "video")
private OrganizationVideo organizationVideo;
\\ rest of video contetns
}
OrganizationVideo.java
@Entity
@Table(name = "organization_video")
public class OrganizationVideo extends Persistable<Long> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;
@JoinColumn(name = "id", referencedColumnName = "id")
@OneToOne(optional = false)
private Video video;
\\ rest of organziation video contents
}
的persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="Default_Persistence_Unit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>jdbc/defaultDataSource</non-jta-data-source>
<properties>
<property name="hibernate.transaction.auto_close_session" value="false"/>
<property name="hibernate.max_fetch_depth" value="0"/>
<property name="hibernate.connection.release_mode" value="auto"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.cglib.use_reflection_optimizer" value="true"/>
</properties>
</persistence-unit>
</persistence>
持久化对象时,一切都很完美 问题在于提取查询
StringBuilder queryStr = new StringBuilder("select v from Video v where v.organizationVideo is null");
Query query = getEntityManager().createQuery(queryStr.toString());
return query.getResultList();
奇怪的行为是这个查询获取数据一次然后没有获取任何试图使用@PrimaryKeyJoinColumn
和更改id
生成类型但没有运气的数据,但确实有一些错误,这看起来很奇怪数据首次尝试从查询中删除is null
时,它会获取数据,但是将空值分配给OrganizationVideo
,那么为什么查询在第一时间不起作用。
答案 0 :(得分:0)
您必须检查为查询生成的SQL,但我猜测由于ID是外键并且它是自动生成的,因此插入实体会导致查询出现问题。首先尝试修复模型:
需要通过视频关系设置OrganizationVideo ID(如果使用JPA 2.0):
tableViewConstraint.constant += 65
那,或者你在OrganizationVideo中创建一个ID映射insertable = false,updatable = false。如果您这样做,那么您必须自己在应用程序内的OrganizationVideo中设置其他字段,并且只有在Video实例分配了ID值之后。由于您使用的是身份,这意味着您必须保留vidoe,flush,然后在OrganizationVideo中使用该值,然后才能保留它。
如果您只是将一个外键添加到OrganizationVideo表并使用它来引用视频ID,那么您的模型会更容易。