nutz icon indicating copy to clipboard operation
nutz copied to clipboard

dao创建外部load的实体时,表名错误

Open saperliu opened this issue 4 years ago • 1 comments

dao.create(User.class, false); 创建时没有获取到注解. User.class是从外部的地止load到内存的,然后使用此方式创建数据库表,表名是类名而非注解里的定义的表名。 loader代码如下: public class CustomClassLoader extends ClassLoader { public Class<?> findClass(String dir,String className) throws ClassNotFoundException { File classFile = new File(dir); if(!classFile.exists()){ throw new ClassNotFoundException(classFile.getPath() + " 不存在") ; } ByteArrayOutputStream bos = new ByteArrayOutputStream() ; ByteBuffer bf = ByteBuffer.allocate(1024) ; FileInputStream fis = null ; FileChannel fc = null ; try { fis = new FileInputStream(classFile) ; fc = fis.getChannel() ; while(fc.read(bf) > 0){ bf.flip() ; bos.write(bf.array(),0 , bf.limit()) ; bf.clear() ; } }catch (IOException e) { e.printStackTrace(); } finally{ try { fis.close() ; fc.close() ; } catch (IOException e) { e.printStackTrace(); } } return defineClass(className,bos.toByteArray() , 0 , bos.toByteArray().length); } } controller里的代码如下: `@RestController public class NutzController {

private static final Logger logger = LoggerFactory.getLogger(NutzController.class);

@Autowired
Dao dao;

private final static CustomClassLoader CLASS_LOADER = new CustomClassLoader();

@GetMapping("/nutz/new")
public String registerNewEntity(@RequestParam(name = "name", required = true) String className) {
    try {
        String  st="E:\\work\\cloud-hseapp\\target\\classes\\cn\\saper\\domain\\Test.class";
        Class entityClass =  CLASS_LOADER.findClass(st, "cn.saper.domain.Test");
        dao.create(entityClass,false);
    } catch (Exception e) {
        logger.error(" registerBean  error  {} :  ", className, e);
    }

    return "成功";
}

} Test.java如下 :package cn.saper.domain;

import org.nutz.dao.entity.annotation.Table;

import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size;

@Table( prefix = "Dns",value = "saper_test") public class Test {

@Id
@GeneratedValue
private Integer id;


@Size(min = 11, max = 11)
@Pattern(regexp = "[0-9]{11}")
private String phone;

@Size(min = 11, max = 11)
private String person;

} `

saperliu avatar Aug 27 '19 02:08 saperliu

是不是有多个User类?dao.create之前,枚举一下这个class的注解信息就清楚了

ps: import错了也是很常见的

wendal avatar Aug 27 '19 06:08 wendal