【问题标题】:Hibernate One-To-Many Mapping, printing mapped listsHibernate 一对多映射,打印映射列表
【发布时间】:2016-10-18 19:54:24
【问题描述】:

我在我的项目中使用了一对多映射。我为每个用户存储了一个点击列表。 但是当我通过调用 getClicks() 方法检索列表时,休眠返回不同格式的列表。 像这样。

"[com.zednx.tech.persistence.Click@29df9a77]"

所以我尝试从列表中读取每个值并分配给一个新列表。

List<Click> clicks=new ArrayList<Click>();      
          for(Click c: e.getClicks()){
        	  Click temp = new Click();
        	  temp.setAff_source(c.getAff_source());
        	  temp.setCb_to_award(c.getCb_to_award());
        	  temp.setCb_type(c.getCb_type());    
        	  clicks.add(temp);        	  
          }

但是当我打印新列表的项目时,它仍然以相同的方式打印。

我需要从这个列表的结果字符串构建一个 JSON。 因此,如果列表以格式返回,它不会帮助我。

除了How to pretty print Hibernate query results?,我找不到任何相关信息

我尝试了 Arrays.ToString(Object o)。但它不起作用。

GSON 构建器部分-

 Gson gson = new GsonBuilder()
		           .registerTypeAdapter(Click.class, new MyTypeAdapter<Click>())
		           .create();
List<Click> clicks=new ArrayList<Click>();      
          for(Click c: e.getClicks()){
        	  Click temp = new Click();
        	  temp.setAff_source(c.getAff_source());
        	  temp.setCb_to_award(c.getCb_to_award());
        	  temp.setCb_type(c.getCb_type());
        	 temp.setCom_to_recieve(c.getCom_to_recieve());
        	  temp.setStore_name(c.getStore_name());
        	  temp.setT_date(c.getT_date());
        	  temp.setT_status(c.getT_status());
        	  temp.setT_ticket(c.getT_ticket());
        	  temp.setUid(c.getUid());
        	  System.out.println(c.toString());
        	  clicks.add(temp);        	  
          }
          String json = gson.toJson(clicks, Click.class);

点击.java

@Entity
@Table(name="click")
public class Click {
	
	@Id
	@Column(name="t_ticket")
	private String t_ticket;
	
	@Column(name="uid",nullable=false)
	private long uid;
	
	public long getUid() {
		return uid;
	}

	public void setUid(long uid) {
		this.uid = uid;
	}

	@ManyToOne
	@JoinColumn(name="uid", 
				insertable=false, updatable=false, 
				nullable=false)
	private Earning earning;
	
	@Column(name="store_name")
	private String store_name;
	
	@Column(name="t_status")
	private String t_status;
	
	@Column(name="aff_source")
	private String aff_source;
	
	@Column(name="com_to_recieve")
	private float com_to_recieve;
	
	@Column(name="t_date")
	private Date t_date;
	
	@Column(name="cb_to_award")
	private float cb_to_award;
	
	@Column(name="cb_type")
	private String cb_type;

	public String getT_ticket() {
		return t_ticket;
	}

	public void setT_ticket(String t_ticket) {
		this.t_ticket = t_ticket;
	}

	

	public Earning getEarning() {
		return earning;
	}

	public void setEarning(Earning earning) {
		this.earning = earning;
	}

	public String getStore_name() {
		return store_name;
	}

	public void setStore_name(String store_name) {
		this.store_name = store_name;
	}

	public String getT_status() {
		return t_status;
	}

	public void setT_status(String t_status) {
		this.t_status = t_status;
	}

	public String getAff_source() {
		return aff_source;
	}

	public void setAff_source(String aff_source) {
		this.aff_source = aff_source;
	}

	public float getCom_to_recieve() {
		return com_to_recieve;
	}

	public void setCom_to_recieve(float com_to_recieve) {
		this.com_to_recieve = com_to_recieve;
	}

	public Date getT_date() {
		return t_date;
	}

	public void setT_date(Date t_date) {
		this.t_date = t_date;
	}

	public float getCb_to_award() {
		return cb_to_award;
	}

	public void setCb_to_award(float cb_to_award) {
		this.cb_to_award = cb_to_award;
	}

	public String getCb_type() {
		return cb_type;
	}

	public void setCb_type(String cb_type) {
		this.cb_type = cb_type;
	}

感谢任何帮助。

【问题讨论】:

  • @AlanHay 感谢您的链接。
  • 可以,但不要依赖 toString () 来处理应用程序逻辑。使用诸如 Jackson 之类的库可以轻松地将对象转换为 Json,反之亦然。 mkyong.com/java/jackson-2-convert-java-object-to-from-json
  • 我为此目的使用 GSON。 GSON 为其他手动构建的列表构建正确的键值 JSON 数组,但仅在这种情况下(映射列表),它没有键值对,但它有这些列表.."[com.zednx.tech.persistence .Click@29df9a77]"
  • Click 对象到“com.zednx.tech.persistence.Click@29df9a77”的转换正在由您的MyTypeAdapter 类完成。请显示该类的代码。另外,如果您删除自定义类型适配器的注册,会发生什么情况?

标签: java json hibernate one-to-many hibernate-onetomany


【解决方案1】:

您需要实现一个 toString 方法,因为您当前的 Click 类可能没有,所以它只是打印为类的名称和实例标识符。

【讨论】:

  • 感谢您的回复。 toString 方法只允许我更改对象标识符的格式,对吗?我正在使用 GSON 进行 json 构建。我为其他列表返回正确的 JSON 数组(键值对),但为映射列表返回“[com.zednx.tech.persistence.Click@29df9a77]”。
  • toString 只是更改了标识符格式,但对 JSON 构建没有影响。
  • 它会改变任何输出 - 您可以在 toString 方法中使用 JSON 构建器在调用 toString 时将对象转换为 JSON 字符串。
  • 没有看到更多代码(其他列表?)(点击类本身?)无法真正评论为什么它在一种情况下有效,而在另一种情况下无效。
  • 好吧,我现在很困惑。如何在 toString 方法中构建 json。我应该只在 toString 本身中使用 GSON 构建器吗??
【解决方案2】:

好的,我终于可以解决我的问题了。 我制作了另一个没有任何注释的 POJO,并将列表项映射到该 POJO 类。 我认为问题在于我在原始 POJO 中拥有的另一个类的映射注释。

getString() 方法也只有助于改变标识符的格式。所以基本上它与 JSON 构建无关,除非您以 JSON 的形式格式化 getString()。

希望对您有所帮助。如果有人想要我制作的新临时 POJO,我可以根据要求发布。 谢谢。

【讨论】:

    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多