我有一个包含字段NAME
的数据库,我需要在PICTURE
等于文件名的每个实体上将图片作为blob类型上传到字段NAME
。但是,在运行代码时会创建一堆具有重复NAME
字段和PICTURE
字段的新实体。
这是我的代码:
主要
public static void main(String[] args) {
File currentDir = new File("C:\\Users\\luccaskammer\\Desktop\\Imagens\\"); // Define o diretorio a ser lido
displayDirectoryContents(currentDir);
}
public static void displayDirectoryContents(File dir) {
try {
ImagensParaDBController contr = new ImagensParaDBController();
File[] files = dir.listFiles();
DeletePng del = new DeletePng();
//ConvertData conv = new ConvertData();
for (File file: files) {
ImagensParaBD img = new ImagensParaBD();
ImagensParaBD name = new ImagensParaBD();
ImagensParaBD picture = new ImagensParaBD();
if (file.isDirectory())
{
System.out.println("directory:" + file.getCanonicalPath());
displayDirectoryContents(file);
}
else if (file.isFile()) {
System.out.println(" file:" + file.getCanonicalPath());
img.setName(del.deletePng(file.getName()));
java.nio.file.Path filelocation = Paths.get(file.getCanonicalPath());
img.setPicture(Files.readAllBytes(filelocation));
contr.insertImageDB(img, picture, name);
}
else {
System.out.println("invalid");
}
}
contr.disconnect();
}
catch(IOException e) {}
}
豆
@Entity
@Table(name = "planegeo")
public class ImagensParaBD implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
//private String pathFolder;
private String name;@Lob
private byte[] picture;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getPicture() {
return picture;
}
public void setPicture(byte[] picture) {
this.picture = picture;
}
}
控制器:
public class ImagensParaDBController {
EntityManagerFactory mf = Persistence.createEntityManagerFactory("mySQLPU");
EntityManager em = mf.createEntityManager();
public void insertImageDB(ImagensParaBD img, ImagensParaBD name, ImagensParaBD picture) {
em.getTransaction().begin();
em.merge(img);
em.getTransaction().commit();
}
public void disconnect() {
em.close();
}
public void insertImageDB(ImagensParaBD img) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
答案 0 :(得分:0)
问题是您是否创建了新实例。相反,您必须从DB检索所有ImagensParaBD,其中name = required。
你新创建的实例没有id,所以hibernate只是插入它们。
List<ImagensParaBD> all = em.createQuery("Select a From ImagensParaBD a where name=:name",
ImagensParaBD.class)
.setParameter("name", theNameTOFind)
.getResultList();
然后迭代添加信息并合并它们的实例
答案 1 :(得分:0)
JPA将尝试从ID中查找数据库行对象。 如果您的Id与数据库ID相同,则唯一的JPA合并该行。
这里你只传递图片对象。 所以首先尝试从数据库中查找对象。 如果它存在于数据库中,则在对象中获取ID和setID。 我会工作的。
示例代码:
Query queryName= em.createQuery(from table_name where picture = :picture);
queryName.setParameter("picture",your picture Object);
list<ImagensParaBD> result = queryName.getResultList();
ImagensParaBD imagensParaBD = new ImagensParaBD();
imagensParaBD = result.get(0);
em.merge(imagensParaBD);