我正在尝试编写使用Hibernate(5.4.3)连接到远程数据库(MariaDB)的Java应用。
表“ RezerwacjeWyposarzenia”包含两个外键作为组合主键。我在构建SessionFactory时遇到问题,因为抛出了异常“ java.lang.IllegalArgumentException:期望IdClass映射”。
这是我的hbm文件的一部分:
<class name="com.reservateApp.entities.RezerwacjeWyposazeniaEntity" table="rezerwacjeWyposazenia" schema="projekt">
<composite-id mapped="true" class="com.reservateApp.entities.RezerwacjeWyposazeniaEntityPK">
<key-property name="wyposarzenieDodatkoweId">
<column name="wyposarzenieDodatkowe_id" sql-type="int(11)"/>
</key-property>
<key-property name="rezerwacjeSalId">
<column name="rezerwacjeSal_id" sql-type="int(11)"/>
</key-property>
</composite-id>
</class>
这是我的实体类:
@Entity
@Table(name = "rezerwacjeWyposazenia", schema = "projekt")
@IdClass(com.reservateApp.entities.RezerwacjeWyposazeniaEntityPK.class)
public class RezerwacjeWyposazeniaEntity {
private int wyposarzenieDodatkoweId;
private int rezerwacjeSalId;
public RezerwacjeWyposazeniaEntity (int wyposarzenieDodatkoweId, int rezerwacjeSalId) {
this.wyposarzenieDodatkoweId = wyposarzenieDodatkoweId;
this.rezerwacjeSalId = rezerwacjeSalId;
}
public RezerwacjeWyposazeniaEntity() {
}
@Id
@Column(name = "wyposarzenieDodatkowe_id", nullable = false)
public int getWyposarzenieDodatkoweId() {
return wyposarzenieDodatkoweId;
}
public void setWyposarzenieDodatkoweId(int wyposarzenieDodatkoweId) {
this.wyposarzenieDodatkoweId = wyposarzenieDodatkoweId;
}
@Id
@Column(name = "rezerwacjeSal_id", nullable = false)
public int getRezerwacjeSalId() {
return rezerwacjeSalId;
}
public void setRezerwacjeSalId(int rezerwacjeSalId) {
this.rezerwacjeSalId = rezerwacjeSalId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RezerwacjeWyposazeniaEntity that = (RezerwacjeWyposazeniaEntity) o;
return wyposarzenieDodatkoweId == that.wyposarzenieDodatkoweId &&
rezerwacjeSalId == that.rezerwacjeSalId;
}
@Override
public int hashCode() {
return Objects.hash(wyposarzenieDodatkoweId, rezerwacjeSalId);
}
}
和密钥类:
public class RezerwacjeWyposazeniaEntityPK implements Serializable {
private int wyposarzenieDodatkoweId;
private int rezerwacjeSalId;
@Column(name = "wyposarzenieDodatkowe_id", nullable = false)
@Id
public int getWyposarzenieDodatkoweId() {
return wyposarzenieDodatkoweId;
}
public void setWyposarzenieDodatkoweId(int wyposarzenieDodatkoweId) {
this.wyposarzenieDodatkoweId = wyposarzenieDodatkoweId;
}
@Column(name = "rezerwacjeSal_id", nullable = false)
@Id
public int getRezerwacjeSalId() {
return rezerwacjeSalId;
}
public void setRezerwacjeSalId(int rezerwacjeSalId) {
this.rezerwacjeSalId = rezerwacjeSalId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RezerwacjeWyposazeniaEntityPK that = (RezerwacjeWyposazeniaEntityPK) o;
return wyposarzenieDodatkoweId == that.wyposarzenieDodatkoweId &&
rezerwacjeSalId == that.rezerwacjeSalId;
}
@Override
public int hashCode() {
return Objects.hash(wyposarzenieDodatkoweId, rezerwacjeSalId);
}
}
建立SessionFactory:
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
factory = metadata.getSessionFactoryBuilder().build();
在构建SessionFactory时得到:“ java.lang.IllegalArgumentException:期望IdClass映射”。