0

私は Hibernateをフォローしていました:ベースクラスを使用して共通フィールドをマップ し、 openjpa継承チュートリアル を使用して、ID、lastModifiedDateなどの共通列をベーステーブルに配置します。

私の注釈付きマッピングは次のとおりです:

BaseTable:

@MappedSuperclass
public abstract class BaseTable {
    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "lastmodifieddate")
    private Date lastModifiedDate;
...

人物テーブル-

    @Entity
    @Table(name = "Person ")
    public class Person extends BaseTable  implements Serializable{

    @Column(name = "name")
    private String name;
...

生成されたステートメントの作成:

create table Person (id integer not null auto_increment,  lastmodifieddate datetime, name varchar(255), primary key (id)) ; 

Personオブジェクトをdbに保存した後、

Person p = new Person();
p.setName("Test");
p.setLastModifiedDate(new Date());
..

getSession().save(p);

日付フィールドを設定していますが、生成されたIDとLastModifiedDate = null、およびName="Test"でレコードを保存しています。

ステートメントの挿入:

insert into Person (lastmodifieddate, name) values (?, ?)
binding parameter [1] as [TIMESTAMP] - <null>
binding parameter [2] as [VARCHAR] - Test

IDクエリによる読み取り: 以下のように休止状態クエリ(IDによる取得)を実行すると、指定されたIDで人を読み取ります。

Criteria c = getSession().createCriteria(Person.class);
c.add(Restrictions.eq("id", id));
Person person= c.list().get(0);
//person has generated ID, LastModifiedDate is null

select query select person0_.id as id8_,  person0_.lastmodifieddate as lastmodi8_, person0_.name as name8_ from Person person0_
 - Found [1] as column [id8_]
 - Found [null] as column [lastmodi8_]
 - Found [Test] as column [name8_ ]

ReadAllクエリ:

Query query = getSession().createQuery("from " + Person.class.getName());
List<Person> allPersons=query.list();

すべて読み取りに対応するSQL

select query select person0_.id as id8_,  person0_.lastmodifieddate as lastmodi8_, person0_.name as name8_ from Person person0_
- Found [1] as column [id8_]
- Found [null] as column [lastmodi8_]
- Found [Test] as column [name8_ ]
- Found [2] as column [id8_]
- Found [null] as column [lastmodi8_]
- Found [Test2] as column [name8_ ]

しかし、コンソールでリストを印刷すると、もっと奇妙になります。ListofPersonオブジェクトを選択しています

  • IDフィールド=すべて0(なぜすべて0?)
  • LastModifiedDate = null
  • 名前フィールドには有効な値があります

ここで何が悪いのかわかりません。見ていただけませんか?

ご参考までに、

私のHibernate-コアバージョン:4.1.2、MySQLコネクタバージョン:5.1.9。

要約すると、ここには2つの問題があります

  • すべて読み取りを使用すると、すべてのIDフィールドが=0になるのはなぜですか?
  • LastModifiedDateが挿入されないのはなぜですか?
4

2 に答える 2

1

使用する

@Temporal(TemporalType.DATE)  

上の注釈Date

ID生成の使用戦略。

@GeneratedValue(strategy=GenerationType.AUTO) 

また

@GeneratedValue(strategy=GenerationType.IDENTITY) 

またはsequanceを使用する

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "custom_generator")
@SequenceGenerator(name = "custom_generator", sequenceName = "sequance_table")  

また、子クラスでプロパティにアクセスすることもできます。

public abstract class BaseTable {

    protected int id;

    protected Date lastModifiedDate;  
// ...  
}    

@Entity
@Table(name = "Person")
public class Person extends BaseTable  implements Serializable{

@Id
@GeneratedValue
@Column(name = "id")
public getId()
{
   return super.id;
}

setId(log id)
{
   super.id = id;
}

@Column(name = "lastmodifieddate")
@Temporal(TemporalType.DATE) 
public getLastModifiedDate()
{
   return super.lastModifiedDate;
}

setLastModifiedDate(Date date)
{
   super.lastModifiedDate = date;
}

public getName()
// ...
}
于 2012-06-16T16:26:02.290 に答える
0

BaseTableクラスでこれを試してください

@Temporal(value = TemporalType.TIMESTAMP)
@Column(name = "lastmodifieddate", nullable = false,
        columnDefinition = "Timestamp default CURRENT_TIMESTAMP")
@org.hibernate.annotations.Generated(value = GenerationTime.ALWAYS)
public Date getLastModifiedDate( )
{
  return this.lastModifiedDate;
}

ここで、BaseTableクラスには@MappedSuperclassが必要です。また、エンティティには1つの生成された日付フィールドが必要です。

@MappedSuperclass
public abstract class BaseTable {

    protected int id;

    protected Date lastModifiedDate;  


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // For Mysql
    // For Oracle or MSSQL @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public int getId()
    {
      return this.id;
    }


    @Temporal(value = TemporalType.TIMESTAMP)
    @Column(name = "lastmodifieddate", nullable = false,
            columnDefinition = "Timestamp default CURRENT_TIMESTAMP")
    @org.hibernate.annotations.Generated(value = GenerationTime.ALWAYS)
    public Date getLastModifiedDate( )
    {
      return this.lastModifiedDate;
    }



}   
于 2012-12-11T12:26:48.790 に答える