一对一关系选择查询仅在第一次提取数据

时间:2015-08-10 17:58:14

标签: java mysql entity-framework hibernate jpa

我正在尝试在两个实体之间应用一对一的关系 第一实体: 视频 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,那么为什么查询在第一时间不起作用。

1 个答案:

答案 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,那么您的模型会更容易。