4

私はそのようなコードを持っています:

Session session = HibernateSessionFactory.sessionFactory.openSession();

    System.out.println("------------------" + session.get(User.class, (long) 10));
    System.out.println("------------------" + session.createSQLQuery("SELECT  * FROM  diploma.tbl_users Where id = 10").addEntity(User.class).uniqueResult());

最初の行はnullを返します。
2番目は有効なレコードを返します。

しかし、場所を変更した場合:

System.out.println("------------------" + session.createSQLQuery("SELECT  * FROM  diploma.tbl_users Where id = 10").addEntity(User.class).uniqueResult());
    System.out.println("------------------" + session.get(User.class, (long) 10));

両方の行が正しい結果を返します。

これは私の休止状態のセッションファクトリです:

public class HibernateSessionFactory {

public static SessionFactory sessionFactory = new Configuration().configure("/META-INF/hibernate.cfg.xml")
        .buildSessionFactory();

 }

なぜsession.get(User.class, (long) 10))nullを返すのですか?

Hibernate構成の更新:

<hibernate-configuration>
<session-factory>

    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/diploma</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    <property name="hibernate.connection.charSet">UTF-8</property>
    <property name="hibernate.hbm2ddl.auto">update</property>

    <property name="show_sql">true</property>
    <property name="format_sql">true</property>

    .........................................
    <mapping class="edu.test.entities.User" />
            ..................................

</session-factory>

User.java

@Entity
@Table(name = "tbl_Users")
public class User extends BaseEntity {

@NotEmpty
@Column(name = "Name")
private String name;

@NotEmpty
@Column(name = "Surname")
private String surname;

@NotEmpty
@Column(name = "Login")
private String login;

@NotEmpty
@Size(min=6, max=20)
@Column(name = "Password")
private String password;

@NotEmpty
@Column(name = "Email")
private String email;

@NotEmpty
@Column(name = "Phone")
private String phone;

@ManyToOne
@JoinColumn(name = "Role", nullable = false)
private Roles role;

    // getters and setters

基本エンティティからのIDフィールド

   @MappedSuperclass
   public class BaseEntity implements Serializable {    
    @Id
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue
private Long id;

UPDATE 2 問題は、ロールをnullにできないことを指定したマッピングファイル@JoinColumn(name = "Role", nullable = false) private Roles role;にあり、ID10で取得しようとしたレコードにnullのロール外部キーがあります。だから私は変更 nullable = trueし、それは動作します。

4

1 に答える 1

2

Hibernateは、Hibernate セッションがマップの役割を果たす Identity Map PoEAA パターンを実装します。を呼び出す.addEntity()と、読み込まれたエンティティが Hibernate セッションに関連付けられます。

次に、Hibernate セッションの get メソッドを呼び出すと、最初にエンティティ キャッシュがチェックされ、存在する場合は既存のエンティティが返されます。

したがって、エンティティを呼び出すときの最初のステートメントgetでは、エンティティ マップにはまだ存在しません。.addEntity()2 番目のスニペットでは、エンティティはメソッドでキャッシュされています。

更新問題は、ロールへの参照がで宣言されてnullable = falseおり、データベースにそのようなロールがないことです。

参照: http://martinfowler.com/eaaCatalog/identityMap.html

于 2012-11-15T13:21:12.263 に答える