繁体   English   中英

hibernate.PropertyNotFoundException:找不到具有多级映射Transformer的setter

[英]hibernate.PropertyNotFoundException: Could not find setter with multi-level mapping Transformer

user_vehicle是我的非持久性DTO类,我正尝试使用休眠SQLQuery来获取同一类的一组记录。

 public class user_vehicle {
        private Integer userid;
        private String username;
        private Integer userYear;
  //here is the problem
        private Vehicle vehicle;
    //getter and setter
    }

public class Vehicle {
    private Integer vehicleId;
    private String vehicleName;
    private Integer vehicleYear;
//getter setter
}

获取记录的代码

String sql = "select a.user_name as username ,b.vehiclename as \"vehicle.vehicleName\"  "
                + "from user_details a inner join vehicle b on a.user_year = b.vehicleyear;";
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("username",StringType.INSTANCE);
query.addScalar("vehicle.vehicleName",StringType.INSTANCE);
query.setResultTransformer(Transformers.aliasToBean(user_vehicle.class));
List<user_vehicle> list = query.list();
list.forEach(t->System.out.println(t.getUsername()+"  --  "+t.getVehicle()));

在线程“主要” org.hibernate.PropertyNotFoundException中得到异常错误:在类user_vehicle上找不到vehicle.vehicleName的设置器

user_details车辆表没有任何关系。

在此处输入图片说明

在此处输入图片说明

我正在这样做,以便我可以访问VehicleName为

list.forEach(t->System.out.println(t.getVehicle().getVehicleName()));

这是我的user_details实体类

  @Entity(name = "User_Details")
 public class User {
 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 @Column(name="user_id")
 private Integer userid;
 @Column(name="user_name")
 private String username;
 @Column(name="user_year")
 private Integer userYear;
 //getter and setter
}
 @Entity
 @Table(name = "Vehicle", catalog = "public", schema = "")
 public class VehicleDetails {
 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Integer vehicleId;
 @Column
 private String vehicleName;
 @Column
 private Integer vehicleYear;
 //getter and setter
}

正如“ 找不到为 setVechicleName() 设置器”的明确说明一样,您缺少私有String vehicleName setVechicleName()方法,请确保已创建它。

当Hibernate将Java对象与Relational表关联时,它使用这些setter方法在从数据库中获取数据时填充数据。

setVechicleName(String vehicleName) {

  this.vehicleName = vehicleName;

}

如果要将实体转换为多级dto类,我认为您应该阅读以下问题: 在Hibernate中使用Transformers.aliasToBean填充子bean 它引用了Hibernate Transformers.aliasToBean()限制,并提供了一个自定义解决方案来绕过它。

另一个解决方案是在user_vehicle dto中内嵌Vehicle dto(更常规的类名,不带下划线,带有驼峰的情况会更标准):

public class user_vehicle {
    private Integer userid;
    private String username;
    private Integer userYear;

   private Integer vehicleId;
   private String vehicleName;
   private Integer vehicleYear;
}


当然,另一个解决方案是使用继承。
从语义userVehicle ,如果userVehiclevehicle ,则可能是合适的绕过解决方案:

public class user_vehicle extends Vehicle{
        private Integer userid;
        private String username;
        private Integer userYear;
}

public class Vehicle {
    private Integer vehicleId;
    private String vehicleName;
    private Integer vehicleYear;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM